package conservare.modelo.funcionario;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import conservare.modelo.Auditavel;
import conservare.modelo.Auditoria;
import conservare.modelo.Endereco;
import conservare.modelo.TelefoneCel;
import conservare.modelo.TelefoneRes;
import conservare.modelo.financeiro.AtestadoMedico;

@Entity
@Table(name="tb_func")
public class Funcionario implements Auditavel, Serializable{
	
	private static final long serialVersionUID = 3891336886409520328L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	private String nome;
	
	@Column(name="dt_nasc")
	private Date dataNascimento;
	
	private String cpf;
	
	@OneToOne
	@JoinColumn(name="cargo_id",referencedColumnName="id")
	private Cargo cargo;

	@Embedded
	private TelefoneRes foneRes;
	
	@Embedded
	private TelefoneCel	foneCel;
	
	private String email;
	
	@Column(name="sexo")
	private String sexo;
	
	@Column(name="num_pis")
	private String numPis;
	
	@Column(name="num_ctps")
	private String numCtps;
	
	@Column(name="num_serie_ctps")
	private String numSerieCtps;
	
	@Temporal(TemporalType.DATE)
	@Column(name="dt_exped_ctps")
	private Date dataExpedicaoCtps;
	
	@Column(name="num_tit_eleitor")
	private String numTituloEleitor;
	
	@Column(name="secao_tit_eleitor")
	private String numSecaoTituloEleitor;
	
	@Column(name="zona_tit_eleitor")
	private String numZonaTituloEleitor;
	
	@Column(name="dt_exped_tit_eleitor")
	private Date dataExpedicaoTituloEleitor;
	
	@Column(name="num_cart_identid")
	private String numCarteiraIdentidade;
	
	@Temporal(TemporalType.DATE)
	@Column(name="dt_exped_cart_identid")
	private Date dataExpedicaoCarteiraIdentidade;
	
	@Column(name="nome_mae")
	private String nomeMae;
	
	@Column(name="nome_pai")
	private String nomePai;
	
	@Embedded
	private Endereco endereco;
	
	@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
	@JoinColumn(name="func_id", referencedColumnName="id")
	private List<ExameMedico> examesMedicos;
	
	@OneToMany(cascade={CascadeType.ALL})
	@JoinColumn(name="func_id", referencedColumnName="id")
	private List<AtestadoMedico> atestadosMedicos;
	
	@OneToMany
	@JoinColumn(name="func_id")
	private List<DependenteFuncionario> dependentes;
	
	@Temporal(TemporalType.DATE)
	@Column(name="dt_admissao")
	private Date dataAdmissao;
	
	@Temporal(TemporalType.DATE)
	@Column(name="dt_demissao")
	private Date dataDemissao;
	
	private BigDecimal salario;
	
	@Embedded
	private Auditoria auditoria;

	
	public void addExameMedico(ExameMedico exameM){
		
		if(getExamesMedicos() == null){
			setExamesMedicos(new ArrayList<ExameMedico>());
		}
		
		if(exameM.getId() == null || exameM.getId() == 0){
			exameM.setAtivo(true);
		}else{
			getExamesMedicos().remove(exameM);
		}
		
		getExamesMedicos().add(exameM);
	}
	
	public void removeExameMedico(ExameMedico exameM){
		
		if(getExamesMedicos() != null){
			getExamesMedicos().remove(exameM);
			exameM.setAtivo(false);
			getExamesMedicos().add(exameM);
		}
		
	}
	
	public void addAtestadoMedico(AtestadoMedico atestado){
		
		if(getAtestadosMedicos() == null){
			setAtestadosMedicos(new ArrayList<AtestadoMedico>());
		}
		
		if(atestado.getId() == null || atestado.getId() == 0){
			atestado.setAtivo(true);
		}else{
			getAtestadosMedicos().remove(atestado);
		}
		
		getAtestadosMedicos().add(atestado);
	}
	
	public void removeAtestadoMedico(AtestadoMedico atestado){
		
		if(getAtestadosMedicos() != null){
			getAtestadosMedicos().remove(atestado);
			atestado.setAtivo(false);
			getAtestadosMedicos().add(atestado);
		}
		
	}
	
	
	public List<ExameMedico> getExamesMedicosAtivos() {
		
		List<ExameMedico> examesAtivos = null;
		if(getExamesMedicos() != null && getExamesMedicos().size() > 0){
			examesAtivos = new ArrayList<ExameMedico>();
			for(ExameMedico exame : getExamesMedicos()){
				if(exame.getAtivo()){
					examesAtivos.add(exame);
				}
			}
		}
			
		return examesAtivos;
	}

	public List<AtestadoMedico> getAtestadosMedicosAtivos() {
		
		List<AtestadoMedico> atestadosAtivos = null;
		if(getAtestadosMedicos() != null && getAtestadosMedicos().size() > 0){
			atestadosAtivos = new ArrayList<AtestadoMedico>();
			for(AtestadoMedico atestado : getAtestadosMedicos()){
				if(atestado.getAtivo()){
					atestadosAtivos.add(atestado);
				}
			}
		}
			
		return atestadosAtivos;
	}

	
	public AtestadoMedico getAtestadoMedicoPeloId(Integer id){
		
		AtestadoMedico retorno = null;
		if(getAtestadosMedicos() != null && getAtestadosMedicos().size() > 0){
			for(AtestadoMedico atestado : getAtestadosMedicos()){
				if(atestado.getId() == id){
					retorno = atestado;
					break;//sai do for
				}
			}
		}
		
		return retorno;
		
	}
	
	public ExameMedico getExameMedicoPeloId(Integer id){
		
		ExameMedico retorno = null;
		if(getExamesMedicos() != null && getExamesMedicos().size() > 0){
			for(ExameMedico exame : getExamesMedicos()){
				if(exame.getId() == id){
					retorno = exame;
					break;//sai do for
				}
			}
		}
		
		return retorno;
		
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public Cargo getCargo() {
		return cargo;
	}

	public void setCargo(Cargo cargo) {
		this.cargo = cargo;
	}


	public TelefoneRes getFoneRes() {
		return foneRes;
	}

	public void setFoneRes(TelefoneRes foneRes) {
		this.foneRes = foneRes;
	}

	public TelefoneCel getFoneCel() {
		return foneCel;
	}

	public void setFoneCel(TelefoneCel foneCel) {
		this.foneCel = foneCel;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getNumPis() {
		return numPis;
	}

	public void setNumPis(String numPis) {
		this.numPis = numPis;
	}

	public String getNumCtps() {
		return numCtps;
	}

	public void setNumCtps(String numCtps) {
		this.numCtps = numCtps;
	}

	public String getNumSerieCtps() {
		return numSerieCtps;
	}

	public void setNumSerieCtps(String numSerieCtps) {
		this.numSerieCtps = numSerieCtps;
	}

	public Date getDataExpedicaoCtps() {
		return dataExpedicaoCtps;
	}

	public void setDataExpedicaoCtps(Date dataExpedicaoCtps) {
		this.dataExpedicaoCtps = dataExpedicaoCtps;
	}

	public String getNumTituloEleitor() {
		return numTituloEleitor;
	}

	public void setNumTituloEleitor(String numTituloEleitor) {
		this.numTituloEleitor = numTituloEleitor;
	}

	public String getNumSecaoTituloEleitor() {
		return numSecaoTituloEleitor;
	}

	public void setNumSecaoTituloEleitor(String numSecaoTituloEleitor) {
		this.numSecaoTituloEleitor = numSecaoTituloEleitor;
	}

	public String getNumZonaTituloEleitor() {
		return numZonaTituloEleitor;
	}

	public void setNumZonaTituloEleitor(String numZonaTituloEleitor) {
		this.numZonaTituloEleitor = numZonaTituloEleitor;
	}

	public String getNumCarteiraIdentidade() {
		return numCarteiraIdentidade;
	}

	public void setNumCarteiraIdentidade(String numCarteiraIdentidade) {
		this.numCarteiraIdentidade = numCarteiraIdentidade;
	}

	public Date getDataExpedicaoCarteiraIdentidade() {
		return dataExpedicaoCarteiraIdentidade;
	}

	public void setDataExpedicaoCarteiraIdentidade(
			Date dataExpedicaoCarteiraIdentidade) {
		this.dataExpedicaoCarteiraIdentidade = dataExpedicaoCarteiraIdentidade;
	}

	public String getNomeMae() {
		return nomeMae;
	}

	public void setNomeMae(String nomeMae) {
		this.nomeMae = nomeMae;
	}

	public String getNomePai() {
		return nomePai;
	}

	public void setNomePai(String nomePai) {
		this.nomePai = nomePai;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public List<ExameMedico> getExamesMedicos() {
		return examesMedicos;
	}
	
	public void setExamesMedicos(List<ExameMedico> examesMedicos) {
		this.examesMedicos = examesMedicos;
	}

	public List<AtestadoMedico> getAtestadosMedicos() {
		return atestadosMedicos;
	}

	public void setAtestadosMedicos(List<AtestadoMedico> atestadosMedicos) {
		this.atestadosMedicos = atestadosMedicos;
	}

	public List<DependenteFuncionario> getDependentes() {
		return dependentes;
	}

	public void setDependentes(List<DependenteFuncionario> dependentes) {
		this.dependentes = dependentes;
	}

	public Date getDataAdmissao() {
		return dataAdmissao;
	}

	public void setDataAdmissao(Date dataAdmissao) {
		this.dataAdmissao = dataAdmissao;
	}

	public Date getDataDemissao() {
		return dataDemissao;
	}

	public void setDataDemissao(Date dataDemissao) {
		this.dataDemissao = dataDemissao;
	}

	public BigDecimal getSalario() {
		return salario;
	}

	public void setSalario(BigDecimal salario) {
		this.salario = salario;
	}

	
	public Date getDataExpedicaoTituloEleitor() {
		return dataExpedicaoTituloEleitor;
	}

	public void setDataExpedicaoTituloEleitor(Date dataExpedicaoTituloEleitor) {
		this.dataExpedicaoTituloEleitor = dataExpedicaoTituloEleitor;
	}

	public Auditoria getAuditoria() {
		return auditoria;
	}

	public void setAuditoria(Auditoria auditoria) {
		this.auditoria = auditoria;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Funcionario other = (Funcionario) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	
	
	
}
